package cn.pconline.autoclub.service;

import cn.pc.util.JsonClient;
import cn.pconline.autoclub.config.SystemConfig;
import cn.pconline.autoclub.entity.User;
import cn.pconline.autoclub.util.Cryptor;
import cn.pconline.r.client.EntityBuilder;
import cn.pconline.r.client.ResponseExtractor;
import cn.pconline.r.client.SimpleHttpTemplate;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.StatusLine;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.fastjson.JSONObject;

/**
 *
 * @author chensy
 */
public class MessageService {

    @Autowired
    private JsonClient jsonClient;
    @Autowired
    private SystemConfig systemConfig;
    @Autowired
    private SimpleHttpTemplate simpleHttpTemplate;
    private static Log log = LogFactory.getLog(MessageService.class);
    public static String UP_LEVEL = "恭喜您！您所在的车友会 %s 升级成%s等级！";
    public static String GIFT_INFO = "本次升级礼包有：%s 礼包会在每周四统一寄出，由会长代签收。";
    public static String ADMIN_UP_LEVEL = "恭喜，您管理的车友会 %s 已满足 %s 升级条件，请前往 %s 进行升级！";
    public static String DOWN_LEVEL = "降级通知：您所在的车友会 %s 由于 %s 不满足目前星级的要求，给予降级处理，有问题可以在车友会版块 进行申诉，谢谢!";
    public static String LOCK_CLUB = "您所在的车友会 %s ，因为违反中国车友会管理条例，于%s暂时被锁，被锁期间车友会操作一切正常，但是不会增加油值。如有疑问，请前往<a href=\"http://bbs.pcauto.com.cn/forum-20495.html\" target=\"_blank\">中国车友会交流论坛</a>向管理员申诉。";
    public static String SEAL_CLUB = "您所在的车友会 %s ，因为违反中国车友会管理条例，于%s暂时被封，被封期间车友会将不能访问。如有疑问，请前往<a href=\"http://bbs.pcauto.com.cn/forum-20495.html\" target=\"_blank\">中国车友会交流论坛</a>向管理员申诉。";
    public static String UNLOCK_CLUB = "您所在的车友会 %s 于%S解锁，可以正常操作和增加油值。";
    public static String UNSEAL_CLUB = "您所在的车友会 %s 于%S解封，可以正常访问。";
    public static String PASS_CLUB = "您申请的 %s 车友会已经通过审核，现在您可以邀请好友加入车友会，车友会升星还有千元礼包等你拿！<a href=\"http://bbs.pcauto.com.cn/topic-6817544.html\" target=\"_blank\">查看车友会会长攻略</a>";
    public static String REFUSED_CLUB = "您申请创建的车友会 %s %s，如有疑问，请前往<a href=\"http://bbs.pcauto.com.cn/forum-20495.html\" target=\"_blank\">中国车友会交流论坛</a>申诉，谢谢！";
    public static String REFUSED_CLUB_DEF_REASON = "由于不符合相关管理规定，审核未通过";
    public static String APPLY_PASS = "恭喜您，您通过了 %s 车友会的申请，赶快去和大家打个招呼吧，还有签到和做任务可以获得金币兑换礼品，一般人我不告诉他的哦！<a href=\"http://bbs.pcauto.com.cn/topic-6835607.html\" target=\"_blank\">查看车友会会员攻略</a>";
    public static String APPLY_REFUSED = "您申请加入车友会 %s 没有通过，您可以再尝试申请加入其他车友会，谢谢！";
    public static String APPLY_RECEIVED = "您管理的车友会 %s 收到 %s 的入会申请，请前往 %s 进行审核，谢谢！";
    public static String UP_ADMIN1 = "您所在的车友会 %s，管理员已将您设为会长。";
    public static String UP_ADMIN2 = "您所在的车友会 %s，管理员已将您设为副会长。";
    public static String DOWN_ADMIN = "您所在的车友会 %s，管理员已将您解除 %s职务。";
    public static String NEW_ACTIVITY = "%s 在您所在的车友会发起了活动 %s ，快去看看呗！";
    public static String CANEL_APPLY = "您所在的车友会 %s，网友 %s 取消申请加入车友会。";
    public static String EXIT_CLUB = "您所在的车友会 %s，会员 %s 退出车友会。";
    public static String FIRED_CLUB = "您所在的车友会 %s，管理员已将您移出车友会。";
    public static String ACTIVITY_APPLY = "您所在车友会的 %s 活动，会员 %s 申请报名，请前往审核。";
    public static String ACT_APPLY_PASS = "您所报名的活动%s 申请已经通过审核，请前往查看。";
    public static String ACT_APPLY_FALSE = "您的活动报名申请未能通过审核，如有疑问，请联系发起人%s";
    public static String ACT_APPLY_CANCEL = "%s 取消了在%s 活动的报名，快去查看下吧！";
    public static String GIFT_REJECT_MSG = "您好，您申请兑换的”%s“礼品失败，原因是“%s”";
    public static String INVITE_JOIN_CLUB_SUCCESS_MSG = "<a href=\"http://my.pcauto.com.cn/%s/\" target=\"_blank\">%s</a>接受了<a href=\"http://my.pcauto.com.cn/%s/\" target=\"_blank\">%s</a>的邀请，加入了<a href=\"http://club.pcauto.com.cn/%s/\" target=\"_blank\">%s</a>车友会";
    /**会员审核通过发短信**/
    public static String APPLY_PASS_SMS = "恭喜，您已经成功加入了%s。赶快下载车友会APP，与车友一起交流、分享您丰富多彩的车生活吧，APP下载地址：http://t.cn/RAknJUg【太平洋汽车网】";
    /**会长审核通过发短信**/
    public static String PASS_CLUB_SMS = "您申请的 %s 车友会已经通过审核，现在您可以邀请好友加入车友会，车友会升星还有千元礼包等你拿！http://suo.im/rjgdg【太平洋汽车网】";
    /**会长审核通过发邮件主题**/
    public static String PASS_CLUB_MAIL_SUBJECT = "恭喜您，您申请的%s车友会通过审核";
    /**会员审核通过发邮件主题**/
    public static String APPLY_PASS_MAIL_SUBJECT = "恭喜您，您已经成功加入%s车友会";
    public static String DELETE_TOPIC = "您发表的帖子 %s 已被会长 %s 从车友会移除，如有疑问请联系该会长。谢谢。";
    public static String DELETE_COMMENT = "您发表的说说已被会长 %s 从车友会移除，如有疑问请联系该会长。谢谢。";
    public static String DELETE_ACTIVITY_JOINED = "您已报名参加的活动已被 %s 删除，如有疑问，请联系该车友。";
    public static String DELETE_ACTIVITY_CREATED = "您发起的活动%s被会长%s删除，如有疑问，请联系该会长。";
    public static String DELETE_ALBUM= "您创建的相册 %s 已被会长 %s删除，如有疑问请联系该会长，谢谢。";
    public static String NEW_NOTICE= "会长 %s发布了新的公告 %s，快去看看吧！";
    
    public static String INVITE_JOIN_APPLY_SUCCESS_MSG = "恭喜，您已成功加入%s，这里可以和车友一起分享精彩的车生活，每天签到和做任务还可以领取金币兑换礼品哦！<a href=\"http://bbs.pcauto.com.cn/topic-6835607.html\" target=\"_blank\">查看车友会会员攻略</a>";
    /**
     * 获取消息队列
     *
     * @return
     */
    private String getMsgFeedUrl() {
        return systemConfig.getMsgFeedUrl();
    }

    /**
     * 获取系统消息类型id
     *
     * @return
     */
    private int getTypeId() {
        if (systemConfig.getSysNoticeTpyeId() != null) {
            return Integer.parseInt(systemConfig.getSysNoticeTpyeId());
        }
        return 0;
    }

    /**
     * 发送系统通知
     *
     * @param receiver 目前只要一个uid就OK了
     * @param content
     */
    public void send(User receiver, String content, Object... args) {
        content = String.format(content, args);
        if (receiver == null) {
            log.warn("receiver is NULL,send msg fail!(" + content + ")");
            return;
        }
        send(receiver.getUid(), content, args);
    }

    public void send(long userId, String content, Object... args) {
        content = String.format(content, args);
        final String url = getMsgFeedUrl();
        final int typeId = getTypeId();
        if (StringUtils.isBlank(url)) {
            log.warn("message feed_url is blank");
            return;
        }
        if (typeId == 0) {
            log.warn("message typeId is 0");
            return;
        }
        final Map<String, Object> contents = new HashMap<String, Object>(2);
        contents.put("content", content);
        jsonClient.sysnotice(url, 0, userId, typeId, contents);
    }

    /**
     * 发送通知
     *
     * @param receiver
     * @param content
     */
    public void send(int typeId, long senderId, long receiverId, Map<String, Object> content) {
        final String url = getMsgFeedUrl();
        jsonClient.sysnotice(url, senderId, receiverId, typeId, content);
    }
    
    /**
     * 发送动态通知
     * @param accountId
     * @param typeId
     * @param contents
     */
    public void sendDyna2BipWithUc(long accountId,int typeId, Map<String, Object> contents){
    	String url = getMsgFeedUrl();
    	jsonClient.newsfeed( url, accountId, typeId, contents);
    }

    /**
     * 拼装发送信息
     *
     * @param urlUrl
     * @param clubName
     * @return
     */
    public String assembleClubUrl(String url, String clubName) {
        String clubUrl = systemConfig.getRoot() + "/" + url + "/";
        return String.format("<a href=\"%s\" target=\"_blank\">%s</a>", clubUrl, clubName);
    }
    
    /**
     *  拼装个人中心url
     * @param uid
     * @param nickname
     * @return 
     */
    public String assembleUserUrl(long uid, String nickname) {
        String userUrl = systemConfig.getUcRoot() + "/" + uid + "/";
        return String.format("<a href=\"%s\" target=\"_blank\">%s</a>", userUrl, nickname);
    }
    
    /**
     *  拼装活动url
     * @param uid
     * @param nickname
     * @return 
     */
    public String assembleActivityUrl(String clubUrl, long activityId, String title) {
        String activityUrl = systemConfig.getRoot() + "/" + clubUrl + "/activity/a"+activityId+"/";
        return String.format("<a href=\"%s\" target=\"_blank\">%s</a>", activityUrl, title);
    }
    
    /**
     *  拼装公告url
     * @param uid
     * @param nickname
     * @return 
     */
    public String assembleNoticeUrl(String clubUrl, long noticeId, String content) {
        String noticeUrl = systemConfig.getRoot() + "/" + clubUrl + "/dt/"+noticeId+"/";
        return String.format("<a href=\"%s\" target=\"_blank\">%s</a>", noticeUrl, content);
    }

    /**
     * 车友会符合升级条件向会长发送的系统消息
     *
     * @param url
     * @param clubName
     * @param level
     * @return
     */
    public String getAdminUpLevelMsg(String url, String clubName, String levelName) {
        String clubUrl = systemConfig.getRoot() + "/" + url + "/";
        String a = String.format("<a href=\"%s\" target=\"_blank\">%s</a>", clubUrl, "车友会主页");
        return String.format(ADMIN_UP_LEVEL, clubName, levelName, a);
    }

    /**
     * 新开线程发送系统消息
     *
     * @param users
     * @param passMsg
     */
    public void sendMsg(final List<User> users, final String passMsg) {
        new Thread() {
            @Override
            public void run() {
                for (User u : users) {
                    send(u, passMsg);
                }
            }
        }.start();
    }
    
    /**
     * 发送手机短信
     * @param phone
     * @param userId
     * @param content
     * @param args
     * @return
     */
    public int sendSMS(String phone,  final long userId, String content, Object... args){
    	content = String.format(content, args);
    	String url = systemConfig.getSMSUrl();
    	String encodeTel = phone + "_" + systemConfig.getSMSAuthorizeKey();
    	try {
			encodeTel = Cryptor.encode(encodeTel, systemConfig.getSMSEncryptionKey(), Cryptor.DES);
		} catch (Exception ex) {
			log.error("encode sendSMS fail !", ex);
		} 
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("telphone", phone);
        map.put("content", content);
        map.put("encodeTel", encodeTel);
        
        String result = simpleHttpTemplate.post(url, null, null, new ResponseExtractor<String>() {
            @Override
            public String extractData(HttpResponse response) throws IOException {
                StatusLine statusLine = response.getStatusLine();
                if (statusLine.getStatusCode() == 200) {
                    try {
                        return EntityUtils.toString(response.getEntity());
                    } catch (IOException ex) {
                        log.error("sendSMS fail 1!", ex);
                    } catch (ParseException ex) {
                        log.error("sendSMS fail 2!", ex);
                    }
                } else {
                    log.error("sendSMS fail uid : " + userId + " statusCode is " + statusLine.getStatusCode());
                    try {
                        log.error(EntityUtils.toString(response.getEntity()));
                    } catch (IOException ex) {
                        log.error("sendSMS fail--IOException", ex);
                    } catch (ParseException ex) {
                        log.error("sendSMS fail--ParseException", ex);
                    }
                }
                return "";
            }
        }, EntityBuilder.entity("utf-8").params(map).build(),3000);
        
        if (result != null) {
            JSONObject obj = JSONObject.parseObject(result);
            if (obj != null) {
                 int status = obj.getIntValue("result");
                 return status;
            }
        } 
        return -1;
    }
    
}
